package com.contextsection;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

public class ContextRepositoryImpl extends ContentProvider{
	public static final String PROVIDER_NAME = "com.contextsection.ContextRepository";
	public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/contextRepository");

	private static final int CONTEXTREPOSITORY = 1;
	private static final int CONTEXTREPOSITORY_ID = 2;

	private static final UriMatcher uriMatcher;

	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(PROVIDER_NAME, "contextRepository", CONTEXTREPOSITORY);
		uriMatcher.addURI(PROVIDER_NAME, "contextRepository/#", CONTEXTREPOSITORY_ID);
	}

	private SQLiteDatabase contextRepositoryDB;

	public static final String _ID = "_id";
	public static final String SUBSCRIPTION = "subscription";

	private static final String DATABASE_NAME = "ContextRepository";
	private static final String DATABASE_TABLE = "subscriptions";
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_CREATE = "create table "
			+ DATABASE_TABLE + " (" + _ID
			+ " integer primary key autoincrement, " + SUBSCRIPTION
			+ " text not null);";

	private static class DatabaseHelper extends SQLiteOpenHelper {
		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE);

		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("Content provider database",
					"Upgrading database from version " + oldVersion + " to "
							+ newVersion + ", which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
			onCreate(db);

		}
	}
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int count = 0;
		switch (uriMatcher.match(uri)) {
		case CONTEXTREPOSITORY:
			count = contextRepositoryDB.delete(DATABASE_TABLE, selection, selectionArgs);
			break;
		case CONTEXTREPOSITORY_ID:
			String id = uri.getPathSegments().get(1);
			count = contextRepositoryDB.delete(DATABASE_TABLE, _ID
					+ " = "
							+ id
							+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
									+ ')' : ""), selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("Unknown URI " + uri);
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	@Override
	public String getType(Uri uri) {
		switch (uriMatcher.match(uri)) {
		// get all repository
		case CONTEXTREPOSITORY:
			return "vnd.android.cursor.dir/vnd.contextsection.contextRepository";
			// get a particular repository
		case CONTEXTREPOSITORY_ID:
			return "vnd.android.cursor.item/vnd.contextsection.contextRepository";
		default:
			throw new IllegalArgumentException("Unsupported URI: " + uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// add a new context
		long rowID = contextRepositoryDB.insert(DATABASE_TABLE, "", values);

		// if added successfully
		if (rowID > 0) {
			Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
			getContext().getContentResolver().notifyChange(_uri, null);
			return _uri;
		}
		throw new SQLException("Failed to insert row into " + uri);
	}

	@Override
	public boolean onCreate() {
		Context context = getContext();
		DatabaseHelper dbHelper = new DatabaseHelper(context);
		contextRepositoryDB = dbHelper.getWritableDatabase();
		return (contextRepositoryDB == null) ? false : true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
		sqlBuilder.setTables(DATABASE_TABLE);

		if (uriMatcher.match(uri) == CONTEXTREPOSITORY_ID)
			// if getting a particular context
			sqlBuilder.appendWhere(_ID + " = " + uri.getPathSegments().get(1));

		if (sortOrder == null || sortOrder == "")
			sortOrder = SUBSCRIPTION;

		Cursor c = sqlBuilder.query(contextRepositoryDB, projection, selection,
				selectionArgs, null, null, sortOrder);

		// register to watch a content URI for changes
		c.setNotificationUri(getContext().getContentResolver(), uri);
		return c;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int count = 0;
		switch (uriMatcher.match(uri)) {
		case CONTEXTREPOSITORY:
			count = contextRepositoryDB.update(DATABASE_TABLE, values, selection,
					selectionArgs);
			break;
		case CONTEXTREPOSITORY_ID:
			count = contextRepositoryDB.update(DATABASE_TABLE, values, _ID
					+ " = "
							+ uri.getPathSegments().get(1)
							+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
									+ ')' : ""), selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("Unknown URI " + uri);
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}



}



